package com.blue.base.common.utils.thread;

import java.util.concurrent.*;

/**
 * 线程工具
 *
 * @author liulei
 * @version 1.0
 */
public class ThreadPoolUtils {
    /**
     * 工具类，构造方法私有化
     */
    private ThreadPoolUtils() {
        super();
    }

    // 线程池核心线程数
    private final static Integer CORE_POOL_SIZE = 10;
    // 最大线程数
    private final static Integer MAX_POOL_SIZE = 50;
    // 空闲线程存活时间[秒]
    private final static Integer KEEP_ALIVE_TIME = 1 * 60;
    // 线程等待队列
    private static BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(20);
    // 线程池对象
    private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
            CORE_POOL_SIZE,
            MAX_POOL_SIZE,
            KEEP_ALIVE_TIME,
            TimeUnit.SECONDS,
            queue,
            new ThreadPoolExecutor.AbortPolicy()
    );

    /**
     * 向线程池提交一个任务,返回线程结果
     *
     * @param callable 带结果的提交线程
     * @return Future 执行结果
     */
    public static Future<?> submit(Callable<?> callable) {
        return threadPool.submit(callable);
    }

    /**
     * 向线程池提交一个任务，不关心处理结果
     *
     * @param runnable 普通线程
     */
    public static void execute(Runnable runnable) {
        threadPool.execute(runnable);
    }

    /**
     * 获取当前线程池线程数量
     */
    public static int getSize() {
        return threadPool.getPoolSize();
    }

    /**
     * 获取当前活动的线程数量
     */
    public static int getActiveCount() {
        return threadPool.getActiveCount();
    }

    /**
     * 获取线程池
     */
    public static ThreadPoolExecutor getThreadPool() {
        return threadPool;
    }
}
